//
//  StatusListViewModel.swift
//  微博个人swift
//
//  Created by 李灏 on 16/2/24.
//  Copyright © 2016年 lh. All rights reserved.
//

import UIKit
import AFNetworking
import SVProgressHUD
import SDWebImage


class StatusListViewModel: NSObject {
    
    lazy var statues = [Status]()
    
    func loadHomeData(isPullUp: Bool, finished: (isSuccess: Bool) -> ()) {
        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
        guard let token = AccountViewModel.sharedAccountViewModel.token else{
            SVProgressHUD.showErrorWithStatus("请登录")
            return
        }
        var parameters = ["access_token":token]
        var since_id: Int64 = 0
        var max_id: Int64 = 0
        if isPullUp {
            //小菊花正在转动  上拉加载更多数据
            max_id = self.statues.last?.id ?? 0
        } else {
            since_id = self.statues.first?.id ?? 0
        }
        if since_id > 0 {
            parameters["since_id"] = "\(since_id)"
        }
        if max_id > 0 {
            parameters["max_id"] = "\(max_id - 1)"
        }
        
        HTTPClient.sharedClient.GET(urlString, parameters: parameters, progress: nil, success: { (_, result) -> Void in
            //将result转为字典类型
            guard let dict = result as? [String:AnyObject] else {
                //执行失败的回调
                finished(isSuccess: false)
                return
            }
            //在字典中通过statuses 这个key 来获取数据
            guard let array = dict["statuses"] as? [[String:AnyObject]] else {
                //执行失败的回调
                finished(isSuccess: false)
                return
            }
            //实例化临时数组
            var tempArr = [Status]()
            //遍历数组获取数据
            for item in array {
                print(item)
                //字典转模型
                let s = Status(dict: item)
                //添加到临时数组
                tempArr.append(s)
            }
            //根据since_id判断要如何处理数据
            //记录临时数组
            if since_id > 0 {
                //在数组的前面进行添加的操作的操作
                self.statues = tempArr + self.statues
            } else if max_id > 0 {
                //上拉加载更多数据
                self.statues += tempArr
            } else {
                //首次加载数据 下拉刷新数据
                self.statues = tempArr
            }
            //执行成功的回调
//            finished(isSuccess: true)
            self.cacheStatusImage(tempArr, finished: finished)
            }) { (_, error) -> Void in
                //执行失败的回调
                finished(isSuccess: false)
                print(error)

        }
    }
    //完成单张图片的下载
    private func cacheStatusImage(array:[Status],finished:(isSuccess:Bool)->()){
        if array.count == 0 {
            //获取的数据为空 不需要下载单张图片
            //需要完成回调  不然在没有加载到新数据  对应刷新状态无法被修改
            finished(isSuccess: true)
            return
        }
        // '群组队列'监听一组异步组任务完成得到统一回调
        //面临的问题 是多次的异步任务执行 需要得到统一的完成回调
        let group = dispatch_group_create()
        for s in array {
            //判断模型中 imageURLs数量
            let imageCount = s.pictureURLs?.count ?? 0
            if imageCount == 1 {
                //                printLog(s.pictureURLs![0])
                //完成单张图片下载
                //在将要开始异步任务前面 向群组中添加异步任务 任务池的任务 + 1
                // dispatch_group_enter 和 dispatch_group_leave 是成对出现的
                dispatch_group_enter(group)
                SDWebImageManager.sharedManager().downloadImageWithURL(s.pictureURLs![0], options: [], progress: nil, completed: { (_, _, _, _, _) -> Void in
                    //异步任务执行完毕之后 需要在任务池 -1
                    dispatch_group_leave(group)
                    print("完成单张图片的下载")
                })
            }
        }
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            //需要完成回调 统一的回调
            print("原创微博的单张图片下载完成")
            finished(isSuccess: true)
        }


        }
    
    
    
    
    
}
